package zuochengyun;

//将整形字符串转成整数值
public class StringToInteger {

	/**
	 * 用于判断是否是有效的整形字符串
	 * @param chars
	 * @return
	 */
	private boolean isValid(char[] chars) {
		if(chars == null || chars.length <= 0){
			return false;
		}
		if(chars[0] != '0' && (chars[0] < '0' || chars[0] > '9')){
			return false;
		}
		if(chars[0] == '0' && (chars.length == 1 || chars[1] == '0')){
			return false;
		}
		if(chars[0] == '0' && chars.length > 1){
			return false;
		}
		for (int i = 1; i < chars.length; i++) {
			if(chars[i] < '0' || chars[i] > '9'){
				return false;
			}
		}
		return true;
	}
	
	public int convert(String str){
		if(str == null || str.length() <= 0){
			return 0;
		}
		char[] chars = str.toCharArray();
		if(!isValid(chars)){
			return 0;
		}
		boolean positive = chars[0] == '-' ? true : false;
		
		//由于负数的范围大1，所以统一处理成负数，然后最后根据positive进行转换
		
		//由于计算下一位的时候是 res * 10 + 下一位，如果res小于minShang之后，肯定会溢出，返回0
		int minShang = Integer.MIN_VALUE / 10;
		//当res 等于minShang之后，如果下一位小于minMod, 也会溢出
		int minMod = Integer.MIN_VALUE % 10;
		
		int res = 0;
		int cur = 0;
		for (int i = positive ? 0 : 1; i < chars.length; i++) {
			cur = '0' - chars[i];
			if(res < minShang || (res == minShang && cur < minMod)){
				return 0; 
			}
			res = res * 10 + cur;
		}
		//比如整数的范围为-2147483648 ~ 2147483647
		//如果为正，结果为-2147483648，那么转换之后会溢出
		if(positive && res == Integer.MIN_VALUE){
			return 0;
		}
		return positive ? -res : res;
	}
}
